﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using QuanLyGiaoVuDAL.DTO;
using QuanLyGiaoVuUI.Models.SinhVien;
using QuanLyGiaoVuService.CommandServices;
using QuanLyGiaoVuService.ReportServices;
using QuanLyGiaoVuUI.Models.NguoiDung;
using QuanLyGiaoVuService.CommonServices;
using System.Runtime.CompilerServices;
using System.IO;
using QuanLyGiaoVuService.Domain;
using QuanLyGiaoVuUI.Models.MonHoc;


namespace QuanLyGiaoVuUI.Controllers
{
    public class SinhVienController : Controller
    {
        //
        // GET: /SinhVien/
        private ISinhVienCommandService _sinhVienCommandService;
        private ISinhVienReportService _sinhVienReportService;
        private IGiangVienCommandService _giangVienCommandService;
        private IGiangVienReportService _giangVienReportService;
        private INguoiDungCommandService _nguoiDungCommandService;
        private INguoiDungReportService _nguoiDungReportService;
        private IDeTaiCommandService _deTaiCommandService;
        private IDeTaiReportService _deTaiReportService;
        private IDangKyDeTaiCommandService _dangKyDeTaiCommandService;
        private IDangKyDeTaiReportService _dangKyDeTaiReportService;
        private IHocKyReportService _hocKyReportService;
        private IThamSoService _thamSoService;
        private IThongBaoCommandService _thongBaoCommandService;
        private IThongBaoReportService _thongBaoReportService;
        private IChiTietThongBaoCommandService _chiTietThongBaoCommandService;
        private IChiTietThongBaoReportService _chiTietThongBaoReportService;
        private IBangDiemCommandService _bangDiemCommandService;
        private IBangDiemReportService _bangDiemReportService;
        private IBauChonDeTaiCommandService _bauChonDeTaiCommandService;
        private IBauChonDeTaiReportService _bauChonDeTaiReportService;
        private IExcelService _excelService;
        private IMonHocReportService _monHocReportService;
        private IMonHocCommandService _monHocCommandService;

        public SinhVienController(ISinhVienCommandService sinhVienCommandService,
            ISinhVienReportService sinhVienReportService,
            INguoiDungCommandService nguoiDungCommandService, 
            INguoiDungReportService nguoiDungReportService,
            IDeTaiCommandService deTaiCommandService, 
            IDeTaiReportService deTaiReportService,
            IDangKyDeTaiCommandService dangKyDeTaiCommandSerivce, 
            IDangKyDeTaiReportService dangKyDeTaiReortService,
            IHocKyReportService hocKyReportService, 
            IThamSoService thamSoService,
            IGiangVienCommandService giangVienCommandService,
            IGiangVienReportService giangVienReportService,
            IThongBaoCommandService thongBaoCommandService,
            IThongBaoReportService thongBaoReportService,
            IChiTietThongBaoCommandService chiTietThongBaoCommandService,
            IChiTietThongBaoReportService chiTietThongBaoReportServie,
            IBangDiemCommandService bangDiemCommandService,
            IBangDiemReportService bangDiemReportService,
            IBauChonDeTaiCommandService bauChonDeTaiCommandService,
            IBauChonDeTaiReportService bauChonDeTaiReportService,
            IExcelService excelService,
            IMonHocCommandService monHocCommandService,
            IMonHocReportService monHocReportService)
        {
            _sinhVienCommandService = sinhVienCommandService;
            _sinhVienReportService = sinhVienReportService;
            _giangVienCommandService = giangVienCommandService;
            _giangVienReportService = giangVienReportService;
            _nguoiDungCommandService = nguoiDungCommandService;
            _nguoiDungReportService = nguoiDungReportService;
            _deTaiCommandService = deTaiCommandService;
            _deTaiReportService = deTaiReportService;
            _dangKyDeTaiCommandService = dangKyDeTaiCommandSerivce;
            _dangKyDeTaiReportService = dangKyDeTaiReortService;
            _hocKyReportService = hocKyReportService;
            _thamSoService = thamSoService;
            _thongBaoCommandService = thongBaoCommandService;
            _thongBaoReportService = thongBaoReportService;
            _chiTietThongBaoCommandService = chiTietThongBaoCommandService;
            _chiTietThongBaoReportService = chiTietThongBaoReportServie;
            _bangDiemCommandService = bangDiemCommandService;
            _bangDiemReportService = bangDiemReportService;
            _bauChonDeTaiCommandService = bauChonDeTaiCommandService;
            _bauChonDeTaiReportService = bauChonDeTaiReportService;
            _excelService = excelService;
            _monHocCommandService = monHocCommandService;
            _monHocReportService = monHocReportService;
        }
        public ActionResult Index()
        {
            //NguoiDungDTO myInfo = new NguoiDungDTO();
            //if (Session["SinhVienInfo"] != null)
            //{
            //    myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            //}
            //else
            //{
            //    return Redirect("/SinhVien/DangNhap");
            //}
            //if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            //{
            //    return Redirect("/DangNhapClient/GiangVienDangNhap");
            //}
            return View();
        }
        public ActionResult LayThongTinCoBanSinhVien()
        {
            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                return Redirect("/SinhVien/DangNhap");
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                return Redirect("/DangNhapClient/GiangVienDangNhap");
            }
            SinhVienViewModel sinhVienViewModel = new SinhVienViewModel();
            sinhVienViewModel = SinhVienViewModel.FromSinhVienDTO(_sinhVienReportService.GetSinhVienById(myInfo.MaNguoiDung));
            return View(sinhVienViewModel);            
        }
        public ActionResult DangNhap()
        {
            return View();
        }
        [HttpPost]
        public ActionResult DangXuat()
        {
            Session["SinhVienInfo"] = null;
            String url = "/SinhVien/DangNhap";
            return Json(new { success = url });
        }
        [HttpGet]
        public ActionResult ThongTinCaNhan()
        {
            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                return Redirect("/SinhVien/DangNhap");
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                return Redirect("/DangNhapClient/GiangVienDangNhap");
            }
            SinhVienViewModel sinhVienViewModel = new SinhVienViewModel();
            sinhVienViewModel = SinhVienViewModel.FromSinhVienDTO(_sinhVienReportService.GetSinhVienById(myInfo.MaNguoiDung));

            return View(sinhVienViewModel);  
        }
        [HttpGet]
        public ActionResult ThongTinCaNhanBangDiem()
        {
            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                return Redirect("/SinhVien/DangNhap");
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                return Redirect("/DangNhapClient/GiangVienDangNhap");
            }
            SinhVienViewModel sinhVienViewModel = new SinhVienViewModel();
            sinhVienViewModel = SinhVienViewModel.FromSinhVienDTO(_sinhVienReportService.GetSinhVienById(myInfo.MaNguoiDung));
            return View(sinhVienViewModel);
        }
        [HttpPost]
        public ActionResult ThongTinCaNhan(String HoTenSV,String NgaySinh, String GioiTinh,String QueQuan,String DiaChi,String Email)
        {
            NguoiDungDTO myInfo = new NguoiDungDTO();
            bool isSuccess = true;
            String mess = "Cập Nhật Thành Công!";
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];                
            }
            else
            {
                isSuccess = false;
                mess = "Vui lòng đăng nhập lại!";
                return Json(new { success = isSuccess, message = mess });
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                isSuccess = false;
                mess = "Tài khoản của bạn không được quyền truy cập!";
                return Json(new { success = isSuccess, message = mess });
            }
            if (HoTenSV.Trim()=="")
            {
                isSuccess = false;
                mess = "Vui lòng nhập Họ Tên!";
                return Json(new { success = isSuccess, message = mess });
            }
            String _hotenSV="";
            DateTime _ngaySinh = new DateTime();
            int _gioiTinh=0;
            String _queQuan="";
            String _diaChi="";
            String _email="";
            try
            {
                _hotenSV = HoTenSV.Trim();
                _ngaySinh = DateTime.Parse(NgaySinh);
                _gioiTinh = Int32.Parse(GioiTinh);
                _queQuan = QueQuan.Trim();
                _diaChi = DiaChi.Trim();
                _email = Email.Trim();

            }
            catch(Exception ex) { 
                
            }
            SinhVienViewModel sinhVienViewModel = new SinhVienViewModel();
            sinhVienViewModel = SinhVienViewModel.FromSinhVienDTO(_sinhVienReportService.GetSinhVienById(myInfo.MaNguoiDung));
            SinhVienDTO sinhVienDTO = new SinhVienDTO();
            sinhVienDTO = sinhVienViewModel.TosinhVienDTO();
            sinhVienDTO.HoTenSV = _hotenSV;
            sinhVienDTO.NgaySinh = _ngaySinh;
            sinhVienDTO.GioiTinh = _gioiTinh;
            sinhVienDTO.QueQuan = _queQuan;
            sinhVienDTO.DiaChi = _diaChi;
            sinhVienDTO.Email = _email;
            //sinhVienViewModel = null;
            sinhVienViewModel = SinhVienViewModel.FromSinhVienDTO(_sinhVienCommandService.UpdateSinhVien(sinhVienDTO));
            if (sinhVienViewModel.ID.Equals(Guid.Empty))
            {
                isSuccess = false;
                mess = "Cập nhật không thành công!";
                return Json(new { success = isSuccess, message = mess });
            }
            return Json(new { success = isSuccess, message = mess });
        }
        public ActionResult LienHe()
        {

            return View();
        }
        [HttpGet]
        public ActionResult DoiMatKhau()
        {
            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                return Redirect("/SinhVien/DangNhap");
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                return Redirect("/SinhVien/DangNhap");
            }
            //NguoiDungDTO newInfo = _nguoiDungCommandService.DoiMatKhauNguoiDung(myInfo);            
            NguoiDungViewModel nguoiDungViewModel = new NguoiDungViewModel();
            nguoiDungViewModel.TaiKhoanDangNhap = myInfo.TaiKhoanDangNhap;
            return View(nguoiDungViewModel);
        }
        [HttpPost]
        public ActionResult DoiMatKhau(String matKhauCu, String matKhauMoi, String matKhauMoi2)
        {
            bool isSuccess = true;
            String mess = "Đổi mật khẩu thành công!";

            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                isSuccess = false;
                mess = "Vui lòng đăng nhập!!!";
                return Json(new { success = isSuccess, message = mess });
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                isSuccess = false;
                mess = "Bạn không được quyền thay đổi thông tin này!";
                return Json(new { success = isSuccess, message = mess });
            }

            if (matKhauCu == "" || matKhauMoi == "" || matKhauMoi2 == "")
            {
                isSuccess = false;
                mess = "Vui lòng điền đầy đủ thông tin bắt buộc (*)!";
                return Json(new { success = isSuccess, message = mess });
            }
            if (matKhauCu != myInfo.MatKhau.Trim())
            {
                isSuccess = false;
                mess = "Mật khẩu cũ không trùng khớp!";
                return Json(new { success = isSuccess, message = mess });
            }
            if (matKhauMoi != matKhauMoi2)
            {
                isSuccess = false;
                mess = "Mật khẩu mới không trùng khớp!";
                return Json(new { success = isSuccess, message = mess });
            }
            myInfo.MatKhauMoi = matKhauMoi.Trim();
            NguoiDungDTO result = _nguoiDungCommandService.DoiMatKhauNguoiDung(myInfo);
            if (result.MatKhau.Trim() != matKhauMoi)
            {
                isSuccess = false;
                mess = "Cập nhật thất bại!";
            }
            Session["SinhVienInfo"] = result;
            return Json(new { success = isSuccess, message = mess });
        }
        [HttpGet]
        public ActionResult XemDeTaiDangKy()
        {
            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                return Redirect("/SinhVien/DangNhap");
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                return Redirect("/SinhVien/DangNhap");
            }
            DangKyDeTaiViewModel dangKyDeTaiViewModel = new DangKyDeTaiViewModel();
            Guid hkHienTai = Guid.Parse(_thamSoService.GetThamSo("HocKyHienTai").ToString());
            HocKyDTO hocky = _hocKyReportService.GetHocKyById(hkHienTai);
            dangKyDeTaiViewModel.NamHoc = _hocKyReportService.GetNamHocById(hocky.MaNamHoc);
            IEnumerable<DangKyDeTaiDTO> dsDeTaiDaDK = _dangKyDeTaiReportService.GetDangKyDeTaiBySinhVienId(myInfo.MaNguoiDung,hocky.MaNamHoc);

            SinhVienDTO sinhVien = new SinhVienDTO();
            sinhVien = _sinhVienReportService.GetSinhVienById(myInfo.MaNguoiDung);
            IEnumerable<DangKyDeTaiDTO> dsDeTaiDaSinhVienKhacDK = new List<DangKyDeTaiDTO>();
            if(sinhVien!=null)
            dsDeTaiDaSinhVienKhacDK = _dangKyDeTaiReportService.GetDangKyDeTaiByMSSV(sinhVien.MaSinhVien, hocky.MaNamHoc);
            SinhVienDeTai svDeTai = new SinhVienDeTai();
            List<DeTaiDTO> dsDeTai=new List<DeTaiDTO>();
            if (dsDeTaiDaDK != null)
            {
                foreach (var detaidk in dsDeTaiDaDK)
                {
                    DeTaiDTO temp = _deTaiReportService.GetDeTaiById(detaidk.MaDeTai);
                    if (temp != null)
                    {
                        dsDeTai.Add(temp);
                    }
                }                
            }
            if (dsDeTaiDaSinhVienKhacDK != null)
            {
                foreach (var detaidk in dsDeTaiDaSinhVienKhacDK)
                {
                    DeTaiDTO temp = _deTaiReportService.GetDeTaiById(detaidk.MaDeTai);
                    if (temp != null)
                    {
                        dsDeTai.Add(temp);
                    }

                    //get thong tin sv lam chung de tai
                    if (detaidk.MaSinhVien1 == detaidk.MaSinhVien2)
                    {
                        SinhVienDTO sv = _sinhVienReportService.GetSinhVienByMSSV(detaidk.MaSinhVien1);
                        if (sv != null)
                        {
                            svDeTai.SinhVien1 = sv;
                            svDeTai.SinhVien2 = sv;
                        }
                    }
                    else
                    {
                        SinhVienDTO sv1 = _sinhVienReportService.GetSinhVienByMSSV(detaidk.MaSinhVien1);
                        SinhVienDTO sv2 = _sinhVienReportService.GetSinhVienByMSSV(detaidk.MaSinhVien2);
                        if (sv1 != null)
                        {
                            svDeTai.SinhVien1 = sv1;
                        }                        
                        if (sv2 != null)
                        {
                            svDeTai.SinhVien2 = sv2;
                        }
                        
                    }
                    if (dsDeTai != null && dsDeTai.Count() > 0)
                    {
                        svDeTai.DeTaiSinhVien = dsDeTai.First();
                    }
                    else
                    {
                        svDeTai.DeTaiSinhVien = new DeTaiDTO();
                    }
                    if (!svDeTai.DeTaiSinhVien.Equals(Guid.Empty))
                    {
                        GiangVienDTO gv1 = new GiangVienDTO();
                        GiangVienDTO gv2 = new GiangVienDTO();

                        if (svDeTai.DeTaiSinhVien.GiangVienHD1!=null && !svDeTai.DeTaiSinhVien.GiangVienHD1.Equals(Guid.Empty))
                        {
                            gv1 = _giangVienReportService.GetGiangVienById(svDeTai.DeTaiSinhVien.GiangVienHD1);
                        }
                        if (svDeTai.DeTaiSinhVien.GiangVienHD2!=null && !svDeTai.DeTaiSinhVien.GiangVienHD2.Equals(Guid.Empty))
                        {
                            gv2 = _giangVienReportService.GetGiangVienById((Guid)svDeTai.DeTaiSinhVien.GiangVienHD2);
                        }
                                               
                        if (gv1 != null)
                        {
                            svDeTai.GiangVien1 = gv1;
                        }
                        if (gv2 != null)
                        {
                            if (gv1.ID != gv2.ID)
                            {
                                svDeTai.GiangVien2 = gv2;
                            }
                        }
                    }
                    break; //get de tai dau tien
                    
                }             
            }

            dangKyDeTaiViewModel.DanhSachDeTaiDaDangKy = dsDeTai;

            IEnumerable<DangKyDeTaiViewModel> danhSachChiTietDeTaiDaDangKy = new List<DangKyDeTaiViewModel>();
            IEnumerable<DangKyDeTaiDTO> danhSachDeTaiDaDangKy = _dangKyDeTaiReportService.GetAllDangKyDeTaiNamHoc(hocky.MaNamHoc);
            dangKyDeTaiViewModel.DanhSachDeTaiNamHoc = _deTaiReportService.GetAllDeTaiNamHoc(hocky.MaNamHoc);
            dangKyDeTaiViewModel.SinhVienDeTai = svDeTai;
            return View(dangKyDeTaiViewModel);           
        }
        [HttpGet]
        public ActionResult DangKyDeTai()
        {
            return View();
        }

        [HttpPost]
        [MethodImpl(MethodImplOptions.Synchronized)]
        public ActionResult DangKyDeTai(String madetaidk,String mssv1, String mssv2)
        {
            
            bool isSuccess = true;
            String mess = "Đăng ký thành công!";

            string duocphepdk = _thamSoService.GetThamSo("ChoPhepSVDangKyDeTai");
            bool duocphep = (duocphepdk == null ? false : bool.Parse(duocphepdk));
            if (!duocphep)
            {
                isSuccess = false;
                mess = "Chưa được phép/Đã hết hạn đăng ký đề tài!";
                return Json(new { success = isSuccess, message = mess });
            }     

            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                isSuccess = false;
                mess = "Vui lòng đăng nhập!!!";
                return Json(new { success = isSuccess, message = mess });
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                isSuccess = false;
                mess = "Bạn không được quyền thực hiện thao tác này!";
                return Json(new { success = isSuccess, message = mess });
            }

            bool duocDangKyDeTai = false;
            try
            {
                duocDangKyDeTai = bool.Parse(_thamSoService.GetThamSo("ChoPhepDangKyDeTai"));
                if (!duocDangKyDeTai)
                {
                    isSuccess = false;
                    mess = "Đã hết thời hạn đăng ký đề tài hoặc hệ thống chưa cho phép đăng ký!";
                    return Json(new { success = isSuccess, message = mess });
                }
            }
            catch (Exception ex)
            {
                isSuccess = false;
                mess = "Hệ thống đang gặp sự cố, vui lòng thử đăng ký lại sau!";
                return Json(new { success = isSuccess, message = mess });
            }

            Guid madetai;
            String masinhvien1;
            String masinhvien2;
            try
            {
                madetai = Guid.Parse(madetaidk);
                masinhvien1 = mssv1.Trim();
                masinhvien2 = mssv2.Trim();
            }
            catch (Exception ex)
            {
                isSuccess = false;
                mess = "Có lỗi xảy ra!!!";
                return Json(new { success = isSuccess, message = mess });
            }
            SinhVienDTO sinhVien1 = new SinhVienDTO();
            SinhVienDTO sinhVien2 = new SinhVienDTO();
            sinhVien1 = _sinhVienReportService.GetSinhVienByMSSV(masinhvien1);
            sinhVien2 = _sinhVienReportService.GetSinhVienByMSSV(masinhvien2);            
            if (sinhVien1 == null || sinhVien2 == null)
            {
                isSuccess = false;
                mess = "Vui lòng kiểm tra lại mã sinh viên!";
                return Json(new { success = isSuccess, message = mess });
            }
            if (sinhVien1.ID != myInfo.MaNguoiDung)
            {
                isSuccess = false;
                mess = "Mã sinh viên của bạn không đúng!";
                return Json(new { success = isSuccess, message = mess });
            }
            if((!sinhVien1.DuDKLuanVan)){
                isSuccess = false;
                mess = "Bạn không đủ điều kiện đăng ký đề tài! Mọi thắc mắc vui lòng liên hệ giáo vụ khoa!";
                return Json(new { success = isSuccess, message = mess });
            }
            if ((!sinhVien2.DuDKLuanVan))
            {
                isSuccess = false;
                mess = "Sinh viên " + sinhVien2.HoTenSV +"("+sinhVien2.MaSinhVien+")"+" không đủ điều kiện đăng ký đề tài! Mọi thắc mắc vui lòng liên hệ giáo vụ khoa!";
                return Json(new { success = isSuccess, message = mess });
            }
            Guid hkHienTai = Guid.Parse(_thamSoService.GetThamSo("HocKyHienTai").ToString());
            HocKyDTO hocky = _hocKyReportService.GetHocKyById(hkHienTai);
            IEnumerable<DangKyDeTaiDTO> dsDeTaiDaDK = _dangKyDeTaiReportService.GetDangKyDeTaiBySinhVienId(myInfo.MaNguoiDung,hocky.MaHocKy);            
            if (dsDeTaiDaDK != null)
            {
                if (dsDeTaiDaDK.Count()>0)
                {
                    isSuccess = false;
                    mess = "Bạn không được đk quá 1 đề tài!!!";
                    return Json(new { success = isSuccess, message = mess });
                }
            }

            IEnumerable<DangKyDeTaiDTO> dsDeTaiDaSinhVienKhacDK = _dangKyDeTaiReportService.GetDangKyDeTaiByMSSV(sinhVien1.MaSinhVien, hocky.MaHocKy);
            if (dsDeTaiDaSinhVienKhacDK != null)
            {
                if (dsDeTaiDaSinhVienKhacDK.Count() > 0)
                {
                    isSuccess = false;
                    mess = "Bạn đã có đề tài với 1 Sinh Viên Khác!"+"<br/>"+"Nếu không đồng ý! Vui lòng hủy đăng ký này để được đăng ký mới!" ;
                    return Json(new { success = isSuccess, message = mess });
                }
            }
            
            DangKyDeTaiDTO dangky = new DangKyDeTaiDTO();
            dangky.MaDangKyDeTai = Guid.NewGuid();
            dangky.MaDeTai = madetai;
            dangky.MaNamHoc = hocky.MaHocKy;
            dangky.SinhVienDangKy = sinhVien1.ID;
            dangky.MaSinhVien1 = sinhVien1.MaSinhVien;
            dangky.MaSinhVien2 = sinhVien2.MaSinhVien;
            dangky.NgayDangKy = DateTime.Now.Date;
            
            DangKyDeTaiDTO temp = _dangKyDeTaiCommandService.InsertDangKyDeTai(dangky);
            if (temp == null)
            {                
                isSuccess = false;
                mess = "Đăng ký không thành công!!!";
                return Json(new { success = isSuccess, message = mess });
            }
            else
            {
                DeTaiDTO dt = _deTaiReportService.GetDeTaiById(temp.MaDeTai);

                ThongBaoDTO thongBaoDangKyThanhCong = new ThongBaoDTO();
                thongBaoDangKyThanhCong.MaThongBao = Guid.NewGuid();
                thongBaoDangKyThanhCong.NgayGuiThongBao = DateTime.Now;
                thongBaoDangKyThanhCong.NoiDungThongBao = "<div>Sinh viên <b>" + sinhVien1.HoTenSV + "</b> đã đăng ký đề tài <b>" + dt.TenDeTai + "</b> cùng với bạn! Nếu không đồng ý, bạn có thể <a href='/SinhVien/XemDeTaiDangKy'><b>hủy</b></a> đề tài!</div>";
                thongBaoDangKyThanhCong.TieuDeThongBao = "Đăng ký đề tài thành công!";
                String strGVID = _thamSoService.GetThamSo("MaGiaoVu");
                thongBaoDangKyThanhCong.NguoiGuiId = Guid.Parse(strGVID);

                ChiTietThongBaoDTO chiTietThongBaoDKThanhCong = new ChiTietThongBaoDTO();
                chiTietThongBaoDKThanhCong.DaXem = 0;
                chiTietThongBaoDKThanhCong.MaChiTietThongBao = Guid.NewGuid();
                chiTietThongBaoDKThanhCong.MaThongBao = thongBaoDangKyThanhCong.MaThongBao;
                chiTietThongBaoDKThanhCong.MaNguoiNhan = sinhVien2.ID;

                try
                {
                    _thongBaoCommandService.InsertThongBao(thongBaoDangKyThanhCong);
                    _chiTietThongBaoCommandService.InsertChiTietThongBao(chiTietThongBaoDKThanhCong);
                    return Json(new { success = isSuccess, message = mess });
                }
                catch
                {
                    return Json(new { success = isSuccess, message = mess });
                }
            }
            return Json(new { success = isSuccess, message = mess });
        }
        [HttpGet]        
        public ActionResult HuyDangKyDeTai()
        {
            return View();
        }
        [HttpPost]
        public ActionResult HuyDangKyDeTai(String madetaidk)
        {
            bool isSuccess = true;
            String mess = "Hủy đăng ký thành công!";

            string duocphepdk = _thamSoService.GetThamSo("ChoPhepSVDangKyDeTai");
            bool duocphep = (duocphepdk == null ? false : bool.Parse(duocphepdk));
            if (!duocphep)
            {
                isSuccess = false;
                mess = "Chưa được phép/Đã hết hạn huỷ đề tài!";
                return Json(new { success = isSuccess, message = mess });
            }
     
            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                isSuccess = false;
                mess = "Vui lòng đăng nhập!!!";
                return Json(new { success = isSuccess, message = mess });
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                isSuccess = false;
                mess = "Bạn không được quyền thực hiện thao tác này!";
                return Json(new { success = isSuccess, message = mess });
            }

            bool duocDangKyDeTai = false;
            try
            {
                duocDangKyDeTai = bool.Parse(_thamSoService.GetThamSo("ChoPhepDangKyDeTai"));
                if (!duocDangKyDeTai)
                {
                    isSuccess = false;
                    mess = "Đã hết thời hạn huỷ đề tài!";
                    return Json(new { success = isSuccess, message = mess });
                }
            }
            catch (Exception ex)
            {
                isSuccess = false;
                mess = "Hệ thống đang gặp sự cố, vui lòng thử đăng ký lại sau!";
                return Json(new { success = isSuccess, message = mess });
            }

            Guid madetai;
            try
            {
                madetai = Guid.Parse(madetaidk);
            }
            catch (Exception ex)
            {
                isSuccess = false;
                mess = "Có lỗi xảy ra!!!";
                return Json(new { success = isSuccess, message = mess });
            }
            SinhVienDTO sinhVien = new SinhVienDTO();
            sinhVien = _sinhVienReportService.GetSinhVienById(myInfo.MaNguoiDung);           
            Guid hkHienTai = Guid.Parse(_thamSoService.GetThamSo("HocKyHienTai").ToString());
            HocKyDTO hocky = _hocKyReportService.GetHocKyById(hkHienTai);
            IEnumerable<DangKyDeTaiDTO> dsDeTaiDaDK = _dangKyDeTaiReportService.GetDangKyDeTaiByMSSV(sinhVien.MaSinhVien, hocky.MaHocKy);

            foreach (var detadk in dsDeTaiDaDK)
            {
                if (detadk.MaDeTai == madetai)
                {
                    if (!_dangKyDeTaiCommandService.DeleteDangKyDeTai(detadk.MaDangKyDeTai))
                    {
                        isSuccess = false;
                        mess = "Không thành công!!!";
                        return Json(new { success = isSuccess, message = mess });
                    }
                    else
                    {
                        SinhVienDTO sinhVien2 = null;
                        if (sinhVien.ID == detadk.SinhVienDangKy)
                        {
                            sinhVien2 = _sinhVienReportService.GetSinhVienByMSSV(detadk.MaSinhVien2);
                        }
                        else
                        {
                            sinhVien2 = _sinhVienReportService.GetSinhVienByMSSV(detadk.MaSinhVien1);
                        }                        
                        if (sinhVien2 != null)
                        {
                            DeTaiDTO dt = _deTaiReportService.GetDeTaiById(detadk.MaDeTai);
                            ThongBaoDTO thongBaoHuyDangKyThanhCong = new ThongBaoDTO();
                            thongBaoHuyDangKyThanhCong.MaThongBao = Guid.NewGuid();
                            thongBaoHuyDangKyThanhCong.NgayGuiThongBao = DateTime.Now;
                            thongBaoHuyDangKyThanhCong.NoiDungThongBao = "<div>Sinh viên <b>" + sinhVien.HoTenSV + "</b> đã hủy đăng ký đề tài <b>" + dt.TenDeTai + "</b> có bạn! Vui lòng <a href='/SinhVien/XemDeTaiDangKy'><b>kiểm tra</b></a> đăng ký!</div>";                            
                            thongBaoHuyDangKyThanhCong.TieuDeThongBao = "Đề tài đăng ký đã bị hủy!";
                            String strGVID = _thamSoService.GetThamSo("MaGiaoVu");
                            thongBaoHuyDangKyThanhCong.NguoiGuiId = Guid.Parse(strGVID);


                            ChiTietThongBaoDTO chiTietThongBaoHuyDKThanhCong = new ChiTietThongBaoDTO();
                            chiTietThongBaoHuyDKThanhCong.DaXem = 0;
                            chiTietThongBaoHuyDKThanhCong.MaChiTietThongBao = Guid.NewGuid();
                            chiTietThongBaoHuyDKThanhCong.MaThongBao = thongBaoHuyDangKyThanhCong.MaThongBao;
                            chiTietThongBaoHuyDKThanhCong.MaNguoiNhan = sinhVien2.ID;

                            try
                            {
                                _thongBaoCommandService.InsertThongBao(thongBaoHuyDangKyThanhCong);
                                _chiTietThongBaoCommandService.InsertChiTietThongBao(chiTietThongBaoHuyDKThanhCong);
                                return Json(new { success = isSuccess, message = mess });
                            }
                            catch(Exception ex){
                                return Json(new { success = isSuccess, message = mess });
                            }
                        }
                    }
                    break;
                }
            }
            return Json(new { success = isSuccess, message = mess });
        }
        public ActionResult BangDiem()
        {
            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                return Redirect("/SinhVien/DangNhap");
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                return Redirect("/SinhVien/DangNhap");
            }            

            BangDiemChuongTrinhKhungViewModel bdChuongTrinhKhungViewModel = new BangDiemChuongTrinhKhungViewModel();

            SinhVienDTO sv = _sinhVienReportService.GetSinhVienById(myInfo.MaNguoiDung);
            bdChuongTrinhKhungViewModel.MaLop = sv.MaLop;
            var dsMonHoc = _monHocReportService.GetAllMonHoc(sv.MaLop);
            bdChuongTrinhKhungViewModel.DanhSachMonHoc = MonHocViewModel.FromMonHocDTOList(_monHocReportService.SapXepMonHoc(dsMonHoc));

            IEnumerable<BangDiemDTO> bangdiem = _bangDiemReportService.GetBangDiemSinhVien(myInfo.MaNguoiDung);
            bdChuongTrinhKhungViewModel.listBangDiem = BangDiemViewModel.FromBangDiemDTOList(bangdiem);
            return View(bdChuongTrinhKhungViewModel);
            
        }
        [HttpGet]
        public ActionResult LichHoc()
        {
            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                return Redirect("/SinhVien/DangNhap");
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                return Redirect("/DangNhapClient/GiangVienDangNhap");
            }
            return View();
        }
        [HttpGet]
        public ActionResult BauChonDeTai()
        {
            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                return Redirect("/SinhVien/DangNhap");
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                return Redirect("/DangNhapClient/GiangVienDangNhap");
            }

            BauChonDeTaiViewModel bauChonDeTaiViewModel = new BauChonDeTaiViewModel();
            //get all de tai 
            IEnumerable<BauChonDeTaiDTO> bauChonDTO = _bauChonDeTaiReportService.GetAllDeTaiBauChon();                        

            //get danh sach de tai ma SV da bau chon
            IEnumerable<BauChonDeTaiDTO> sinhVienBauChonDTO = _bauChonDeTaiReportService.GetAllDeTaiSinhVienBauChon(myInfo.MaNguoiDung);
            List<BauChonDeTaiDTO> tempBauChonDetai = new List<BauChonDeTaiDTO>();
            foreach (var detai in bauChonDTO)
            {
                DeTaiDTO detaiDTO = _deTaiReportService.GetDeTaiById(detai.DeTai.MaDeTai);
                if (detaiDTO != null)
                {
                    detaiDTO.GiangVien1 = _giangVienReportService.GetGiangVienById(detaiDTO.GiangVienHD1);
                    detaiDTO.GiangVien1 = (detaiDTO.GiangVien1 != null ? detaiDTO.GiangVien1 : new GiangVienDTO());
                    Guid idGV2 = detaiDTO.GiangVienHD2.Value;
                    if (!idGV2.Equals(Guid.Empty))
                    {
                        detaiDTO.GiangVien2 = _giangVienReportService.GetGiangVienById(idGV2);
                        detaiDTO.GiangVien2 = (detaiDTO.GiangVien1 != null ? detaiDTO.GiangVien2 : new GiangVienDTO());
                    }
                    detaiDTO.SoLuotBauChon = detai.DeTai.SoLuotBauChon;    
                    detai.DeTai = detaiDTO;
                    tempBauChonDetai.Add(detai);
                }
            }
            List<BauChonDeTaiDTO> tempSinhVienBauChonDetai = new List<BauChonDeTaiDTO>();
            foreach (var detai in tempBauChonDetai)
            {
                foreach (var dtsv in sinhVienBauChonDTO)
                {
                    if (dtsv.DeTai.MaDeTai == detai.DeTai.MaDeTai)
                    {
                        tempSinhVienBauChonDetai.Add(detai);
                    }
                }
            }
            bauChonDeTaiViewModel.DanhSachDeTaiBauChon = tempBauChonDetai;
            bauChonDeTaiViewModel.DanhSachDeTaiSinhVienBauChon = tempSinhVienBauChonDetai;
           return View(bauChonDeTaiViewModel);
        }
        [HttpPost]
        public ActionResult BauChonDeTai(Guid MaDeTai, int action)
        {
            bool isSuccess = true;
            String mess = (action > 0 ? "Bầu chọn thành công!" : "Huỷ bầu chọn thành công!");
            

            NguoiDungDTO myInfo = new NguoiDungDTO();
            if (Session["SinhVienInfo"] != null)
            {
                myInfo = (NguoiDungDTO)Session["SinhVienInfo"];
            }
            else
            {
                isSuccess = false;
                mess = "Vui lòng đăng nhập!";
                return Json(new { success = isSuccess, message = mess });
            }
            if (myInfo.VaiTro == 1) // =1 la giang vien; !=1 la sinh vien
            {
                isSuccess = false;
                mess = "Bạn không được quyền thực hiện thao tác này!";
                return Json(new { success = isSuccess, message = mess });
            }

            if (action > 0)
            {
                _bauChonDeTaiCommandService.InsertDeTaiBauChon(myInfo.MaNguoiDung, MaDeTai);
            }
            else
            {
                _bauChonDeTaiCommandService.RemoveDeTaiBauChon(myInfo.MaNguoiDung, MaDeTai);
            }

            return Json(new { success = isSuccess, message = mess });
        }

        [HttpGet]
        public void NhapDieuKienKhoaLuan()
        {
            FileStream fs = new FileStream(@"D:\dsDieuKien.xlsx",FileMode.Open);
            MemoryStream ms = new MemoryStream();
            byte[] buffer = new byte[4096];
            while (true)
            {
                int readCount = fs.Read(buffer,0, buffer.Length);
                if (readCount <= 0)
                    break;
                ms.Write(buffer, 0 , readCount);
            }
            fs.Close();
            IEnumerable<ExcelReadDataModel> data = _excelService.ReadExcelDataFile(ms, 9, 127, "C", "AR");
        }
    }
}
